#include "../include/head.h"

//登录菜单
void login_menu() {
    system("clear");
    
    // 上边框和标题
    printf("\033[1;36m┌──────────────────────────────────────┐\n");
    printf("│           \033[1;33m🛒 商品管理系统\033[1;36m            │\n");
    printf("├──────────────────────────────────────┤\n");
    
    // 菜单选项（带图标和颜色）
    printf("│\033[0m  \033[32m1. 💻 管理员登录\033[0m                    \033[1;36m│\n");
    printf("│\033[0m  \033[33m2. 👤 用户登录\033[0m                      \033[1;36m│\n");
    printf("│\033[0m  \033[35m3. 📝 用户注册\033[0m                      \033[1;36m│\n");
    printf("\033[1;36m├──────────────────────────────────────┤\n");
    printf("│  \033[31m4.  ⏏ 退出系统\033[0m                      \033[1;36m│\n");
    printf("└──────────────────────────────────────┘\033[0m\n\n");
    
    // 输入提示（带闪烁光标）
    printf("\033[5;37m▷ 请输入选项 [1-4]: \033[0m");
}

/*=====================================================================================================================================*/
//管理员菜单
void admin_menu() {
    

    // 菜单边框和标题（青色加粗）
    printf("\033[1;36m┌──────────────────────────────────────┐\n");
    printf("│     \033[1;33m商品管理系统 - 管理员模式\033[1;36m        │\n");
    printf("├──────────────────────────────────────┤\033[0m\n");

    // 菜单选项（数字高亮+选项分组）
    printf("\033[1;36m│\033[0m  \033[32m1. 添加商品\033[0m                         \033[1;36m│\n");
    printf("│\033[0m  \033[33m2. 查询商品\033[0m \033[90m(可删改)\033[0m                \033[1;36m│\n");
    printf("│\033[0m  \033[34m3. 显示所有商品\033[0m                     \033[1;36m│\n");
    printf("│\033[0m  \033[35m4. 商品库存出入\033[0m                     \033[1;36m│\n");
    printf("│\033[0m  \033[36m5. 商品排序\033[0m                         \033[1;36m│\n");
    printf("├──────────────────────────────────────┤\n");
    printf("│  \033[31m6. 退出系统\033[0m                         \033[1;36m│\n");
    printf("└──────────────────────────────────────┘\033[0m\n");

    // 输入提示（闪烁效果）
    printf("\033[5;37m请输入选项: \033[0m");
}

/*=====================================================================================================================================*/

//用户菜单
void user_menu() {
    system("clear"); // 清屏
    
    // 顶部边框和标题
    printf("\033[1;36m┌──────────────────────────────────────┐\n");
    printf("│       \033[1;34m🛍️ 商品管理系统 - 用户模式\033[1;36m      │\n");
    printf("├──────────────────────────────────────┤\n");
    
    // 菜单选项（带图标和颜色）
    printf("│\033[0m  \033[32m1. 🔍 查询商品\033[0m                      \033[1;36m│\n");
    printf("│\033[0m  \033[33m2. 📋 显示所有商品\033[0m                  \033[1;36m│\n");
    printf("│\033[0m  \033[35m3. 🔄 商品排序\033[0m                      \033[1;36m│\n");
    printf("│\033[0m  \033[34m4. 🛒 显示购物车清单\033[0m                \033[1;36m│\n");
    printf("\033[1;36m├──────────────────────────────────────┤\n");
    printf("│  \033[31m5. ⏏ 退出系统\033[0m                       \033[1;36m│\n");
    printf("└──────────────────────────────────────┘\033[0m\n\n");
    
    // 输入提示（带闪烁光标）
    printf("\033[5;37m▷ 请输入选项 [1-5]: \033[0m");
}

/*=====================================================================================================================================*/
//延时函数
void delay() {
    char input;
    printf("\n\n按回车键返回上级目录" );
    while (getchar() != '\n');
    while (1) {
        input = getchar();
        if (input == '\n') {
            printf("正在退出中...\n");
            sleep(1);
            system("clear");
            break;
        }
    }
}
/*=====================================================================================================================================*/

// 计算中英文混合字符串的显示宽度
int get_display_width(const char *str) {
    int width = 0;
    while (*str) {
        if (*str < 0 || *str > 127) { // 中文字符
            width += 2;
            str += 3; // UTF-8中文字符通常占3字节
        } else {
            width += 1;
            str += 1;
        }
    }
    return width;
}

/*=====================================================================================================================================*/

// 打印固定宽度的字符串
void print_fixed_width(const char *str, int width) {
    int actual_width = get_display_width(str);
    printf("%s", str);
    for (int i = actual_width; i < width; i++) {
        printf(" ");
    }
}

/*=====================================================================================================================================*/

//删除线版本
void print_fixed_width2(const char *str, int width) {
    int actual_width = get_display_width(str);
    printf("\033[1;31;9m%s\033[0m", str);
    for (int i = actual_width; i < width; i++) {
        printf(" ");
    }
}

/*=====================================================================================================================================*/

//绿色版本
void print_fixed_width3(const char *str, int width) {
    int actual_width = get_display_width(str);
    printf("\033[1;32m%s\033[0m", str);
    for (int i = actual_width; i < width; i++) {
        printf(" ");
    }
}

/*=====================================================================================================================================*/

//打印表头函数
void print_table_header() {
    // 打印表头
    printf("\033[1;36m┌────────────┬────────────────┬────────────┬────────────┐\033[0m\n");
    printf("\033[1;36m│");
    print_fixed_width("  商品编号", ID_WIDTH);
    printf("│");
    print_fixed_width("  商品名称", NAME_WIDTH);
    printf("│");
    print_fixed_width("  商品价格", PRICE_WIDTH);
    printf("│");
    print_fixed_width("  商品库存", STOCK_WIDTH);
    printf("│\033[0m\n");
    printf("\033[1;36m├────────────┼────────────────┼────────────┼────────────┤\033[0m\n");
}

/*=====================================================================================================================================*/

//打印自定义表格
void print_custom_table(CommodityNode *current) {
    printf(CYAN("│ "));
    print_fixed_width(current->commodity.id, ID_WIDTH-1);
    
    printf(CYAN("│ "));
    print_fixed_width(current->commodity.name, NAME_WIDTH-1);
    
    printf(CYAN("│ "));
    char price_str[20];
    sprintf(price_str, "%.2f", current->commodity.price);
    print_fixed_width(price_str, PRICE_WIDTH-1);
    
    printf(CYAN("│ "));
    char stock_str[20];
    sprintf(stock_str, "%d", current->commodity.stock);
    print_fixed_width(stock_str, STOCK_WIDTH-1);
    
    printf(CYAN("│\n"));
    
}

/*=====================================================================================================================================*/

//打印表尾函数
void print_table_tail()
{
    printf("\033[1;36m└────────────┴────────────────┴────────────┴────────────┘\033[0m\n");
}


/*=====================================================================================================================================*/

//打印购物车清单
void print_shopping_cart(CommodityList *shopping_cart)
{
    // 打印表头
    printf("\033[1;36m┌────────────┬────────────────┬────────────┬────────────┐\033[0m\n");
    printf("\033[1;36m│");
    print_fixed_width("  商品编号", ID_WIDTH);
    printf("│");
    print_fixed_width("  商品名称", NAME_WIDTH);
    printf("│");
    print_fixed_width("  商品价格", PRICE_WIDTH);
    printf("│");
    print_fixed_width("  购买数量", STOCK_WIDTH);
    printf("│\033[0m\n");
    printf("\033[1;36m├────────────┼────────────────┼────────────┼────────────┤\033[0m\n");
    
    CommodityNode *current = shopping_cart->head;
    while (current != NULL)
    {
        print_custom_table(current);
        if(current->next != NULL)
        {
            printf("\033[1;36m├────────────┼────────────────┼────────────┼────────────┤\033[0m\n");
        }
        
        current = current->next;
    }
    
    print_table_tail();
}



//购物车清单
void display_shopping_cart(CommodityList *list ,CommodityList *shopping_cart)
{
    print_shopping_cart(shopping_cart);
    
    // 打印购物车操作选项
    // 顶部边框和标题
    printf("\033[1;36m┌──────────────────────────────────────┐\n");
    printf("│        \033[1;35m🛒 购物车管理\033[1;36m                 │\n");
    printf("├──────────────────────────────────────┤\n");
    
    // 菜单选项（带图标和颜色）
    printf("│\033[0m  \033[32m1. 🛍️  选择商品结算\033[0m                  \033[1;36m│\n");
    printf("│\033[0m  \033[33m2. 🧾 全选结算\033[0m                      \033[1;36m│\n");
    printf("│\033[0m  \033[31m3. ❌ 删除购物车商品\033[0m                \033[1;36m│\n");
    printf("\033[1;36m├──────────────────────────────────────┤\n");
    printf("│  \033[90m4. ↩ 返回主菜单\033[0m                     \033[1;36m│\n");
    printf("└──────────────────────────────────────┘\033[0m\n\n");
    
    // 输入提示（带闪烁光标）
    printf("\033[5;37m▷ 请输入选项 [1-4]: \033[0m");

    int choice;
    scanf("%d", &choice);
    switch (choice)
    {
    case 1:
        checkout(list ,shopping_cart);
        break;
    case 2:
        checkout_all(list ,shopping_cart);
        break;
    case 3:
        delete_shopping_cart(shopping_cart);
        break;
    case 4:
        break;
    default:
        printf("\033[1;31m⚠ 无效的选项！\033[0m\n");
        break;
    }
}

//选择商品结算逻辑函数
void checkout(CommodityList *list ,CommodityList *shopping_cart)
{
    system("clear");
    print_shopping_cart(shopping_cart);
    printf("\033[1;37m▷ 请选择您要结算的商品编号: \033[0m");
    char checkout_id[64];
    scanf("%s", checkout_id);
    CommodityNode *com = list->head;
    CommodityNode *current = shopping_cart->head;
    CommodityNode *prev = NULL;
    while (current != NULL)
    {
        if (strcmp(current->commodity.id, checkout_id) == 0)
        {
            //检查库存
            if (current->commodity.stock > 0)
            {
                printf("请输入%.2f * %d = %.2f元用于支付该商品的费用\n",current->commodity.price, current->commodity.stock, current->commodity.price*current->commodity.stock);
                float payment;
                scanf("%f", &payment);
                //检查支付金额
                if (payment < current->commodity.price)
                {
                    printf("\033[1;31m⚠ 支付金额不足！\033[0m\n");
                    return;
                }
                
                //更新库存
                while (com != NULL)
                {
                    if (strcmp(com->commodity.id, current->commodity.id) == 0)
                    {
                        com->commodity.stock -= current->commodity.stock;
                        break;
                    }
                    com = com->next;
                }
                //删除购物车商品
                if (prev == NULL)
                {
                    shopping_cart->head = current->next;
                }
                else
                {
                    prev->next = current->next;
                }
                free(current);
                shopping_cart->size--;
                printf("\033[1;32m✅ 支付成功！\033[0m\n");

                //将商品信息写入文件
                write_commodity_to_file(list);
                //将购物车信息写入文件
                write_shopping_cart_to_file(shopping_cart);
                printf("\033[1;32m✅ 商品已从购物车中删除！\033[0m\n");
                printf("\033[1;32m✅ 商品库存已更新！\033[0m\n"); 
                return ;
            }
            else
            {
                printf("\033[1;31m⚠ 商品库存不足！\033[0m\n");

            }

        }
        prev = current; // 更新上一个节点
        current = current->next; // 更新当前节点
    }
    if (current == NULL)
    {
        // 如果没有找到商品
        printf("\033[1;31m⚠ 未找到相关商品信息。\033[0m\n");
    }

}

/*=====================================================================================================================================*/

//全选结算函数
void checkout_all(CommodityList *list ,CommodityList *shopping_cart)
{
    system("clear");
    print_shopping_cart(shopping_cart);
    CommodityNode *com = list->head;
    CommodityNode *current = shopping_cart->head;

    float payment = 0;
    if (current == NULL)
    {
        // 如果没有找到商品
        printf("\033[1;31m⚠ 未找到相关商品信息。\033[0m\n");
        return;
    }
    
    while (current != NULL)
    {
        if (current->commodity.stock > 0)
        {
            payment += current->commodity.price*current->commodity.stock;
            printf("%.2f * %d = %.2f\n",current->commodity.price,current->commodity.stock,current->commodity.price*current->commodity.stock);
        }
        
        current = current->next; 
    }
    printf("请输入%.2f元用于支付该商品的费用\n",payment);
    float my_payment;
    scanf("%f", &my_payment);
    //检查支付金额
    if (my_payment < payment)
    {
        printf("\033[1;31m⚠ 支付金额不足！\033[0m\n");
        return;
    }
    
    // 更新库存
    current = shopping_cart->head;
    while (current != NULL)
    {
        com = list->head;
        while (com != NULL)
        {
            if (strcmp(com->commodity.id, current->commodity.id) == 0)
            {
                com->commodity.stock -= current->commodity.stock;
                break;
            }
            com = com->next;
        }
        current = current->next;
    }
    // 清空购物车
    current = shopping_cart->head;
    while (current != NULL)
    {
        CommodityNode *temp = current;
        current = current->next;
        free(temp);
    }
    shopping_cart->head = NULL;
    shopping_cart->size = 0;
    printf("\033[1;32m✅ 支付成功！\033[0m\n");
    //将商品信息写入文件
    write_commodity_to_file(list);
    //将购物车信息写入文件
    write_shopping_cart_to_file(shopping_cart);
    printf("\033[1;32m✅ 商品已从购物车中删除！\033[0m\n");
    printf("\033[1;32m✅ 商品库存已更新！\033[0m\n"); 
    
}

/*=====================================================================================================================================*/

//删除购物车商品
void delete_shopping_cart(CommodityList *shopping_cart)
{
    system("clear");
    print_shopping_cart(shopping_cart);
    CommodityNode *current = shopping_cart->head;
    CommodityNode *prev = NULL;
    if(current == NULL)
    {
        printf("\033[1;31m⚠ 购物车为空，无法删除！\033[0m\n");
        return;
    }
    printf("\033[1;37m▷ 请选择您要删除的商品编号: \033[0m");
    char checkout_id[64];
    scanf("%s", checkout_id);
    while (current != NULL)
    {
        if (strcmp(current->commodity.id, checkout_id) == 0)
        {
            if (prev == NULL)
            {
                shopping_cart->head = current->next;
            }
            else
            {
                prev->next = current->next;
            }
            free(current);
            shopping_cart->size--;
            //将购物车信息写入文件
            write_shopping_cart_to_file(shopping_cart);
            printf("\033[1;32m✅ 商品已从购物车中删除！\033[0m\n");
            return ;

        }
        prev = current; // 更新上一个节点
        current = current->next; // 更新当前节点
    }
    if (current == NULL)
    {
        // 如果没有找到商品
        printf("\033[1;31m⚠ 未找到相关商品信息。\033[0m\n");
    }
    
}